배경
해당 글은 Inflearn에 있는 [Android 고급] 백그라운드 서비스 끝판왕 – Flavor 설정부터 MVI 아키텍처까지라는 강의에 Section2에 GpsStatusBadge 컴포넌트 UI 구현이라는 강좌를 보고 추가적으로 자료를 찾아 정리한 글입니다.
전체 코드 및 결과물
사진과 같이 상태를 보여주는 뱃지를 만들어 실제 러닝 앱에서 상태가 상황에 따라 자동으로 변환되는 기능의 UI를 만들어 보겠습니다.
@Composable
fun GpsStatusBadge(
modifier: Modifier = Modifier,
status: GpsStatus,
onClick : (() -> Unit)? = null,
) {
val color: Color
val text: String
val icon: ImageVector
when(status) {
GpsStatus.Disabled -> {
color = AppTheme.colors.secondaryText
text = "GPS Disabled"
icon = Icons.Default.Block
}
GpsStatus.Acquired -> {
color = AppTheme.colors.warning
text = "Searching GPS..."
icon = Icons.Default.Refresh
}
GpsStatus.Enabled -> {
color = AppTheme.colors.success
text = "GPS Connected"
icon = Icons.Default.Map
}
GpsStatus.Lost -> {
color = AppTheme.colors.error
text = "GPS Lost"
icon = Icons.Default.LegendToggle
}
}
Surface(
shape = RoundedCornerShape(12.dp),
color = color.copy(alpha = 0.9f),
contentColor = Color.White,
modifier = modifier.then(
if(onClick != null) {
Modifier.clickable {onClick()}
} else {
Modifier } )
) {
Row(
modifier = Modifier.padding(
horizontal = 8.dp,
vertical = 4.dp
)
) {
Icon(
imageVector = icon,
contentDescription = null,
modifier = Modifier.size(14.dp)
)
Text(
text = text,
style = AppTheme.typography.caption,
fontWeight = FontWeight.Bold
)
}
}}
@Preview(showBackground = true)
@Composable
private fun GpsStatusBadgePreview() {
Column(
modifier = Modifier.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
GpsStatusBadge(status = GpsStatus.Lost)
GpsStatusBadge(status = GpsStatus.Enabled)
GpsStatusBadge(status = GpsStatus.Disabled)
GpsStatusBadge(status = GpsStatus.Acquired)
}
}Composable 만들기
UI 개발에 있어서 제일 먼저 해야 할 것은 Composable 인 것 같습니다. Composable에 대해서 궁금하신 분들은 해당 글을 읽고 와주세요